package cn.edu.swu.gyt.repo;
import org.apache.commons.dbcp2.BasicDataSource;

import java.util.List;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DatabaseService {
    public static BasicDataSource dataSource=null;
    private static DatabaseService instance=new DatabaseService();
    public final static String CONTEXT_KEY="DATABASE_SERVICE";
    private DatabaseService(){
    }

    public static DatabaseService getInstance(){
        return instance;
    }
    // 初始化连接池配置
    public void init(){
        // 创建数据源实例
        dataSource = new BasicDataSource();

        // 1. 配置数据库连接信息
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); // MySQL驱动类
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/bookstore"); // 数据库URL
        dataSource.setUsername("root"); // 数据库用户名
        dataSource.setPassword("qwer1234"); // 数据库密码

        // 2. 配置连接池参数
        dataSource.setInitialSize(3); // 初始连接数（启动时创建的连接数量）
        dataSource.setMaxTotal(6); // 最大连接数（连接池允许的最大连接数量）
        dataSource.setMaxIdle(4); // 最大空闲连接数（空闲时保留的最大连接数量）
        dataSource.setMinIdle(2); // 最小空闲连接数（空闲时至少保留的连接数量）
        dataSource.setMaxWaitMillis(10000); // 获取连接的最大等待时间（毫秒，超时则抛出异常）

    }

    // 获取数据库连接（从连接池）
    private static Connection getConnection() throws SQLException {
        // 从连接池获取连接（注意：此处的close()是归还连接到池，而非真正关闭）
        return dataSource.getConnection();
    }

    public void closeDataSource(){
        if(dataSource!=null){
            try{
                dataSource.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    //查询数据
    public List query(String sql, ResultSetVisitor visitor) throws SQLException {
        try(Connection connection=this.dataSource.getConnection()){
            try(Statement statement=connection.createStatement()){
                try(ResultSet resultSet=statement.executeQuery(sql)){
                    return  visitor.visit(resultSet);
                }
            }
        }
    }
    //删除数据
    public boolean excute(String sql ) throws SQLException{
        try(Connection connection=this.dataSource.getConnection()){
            try(Statement statement=connection.createStatement()){
                return statement.execute(sql);
            }
        }
    }


}

